﻿using UnityEngine;
using System.Collections;

public class Popup_Base : ObjectBase
{   
    // 터치 관련 변수   
    GameObject m_PretouchOBJ = null;   // 터치 시작 끝 같은 오브젝트일때
    Vector2 m_SaveTouchDown;    // 드래그 판단에 쓰일 마우스 포지션 저장 변수
    float m_DragGap = 50.0f;   // 드래그인지 아닌지 판단하는 포지션 차이 
    bool isAbleControl = true;
    bool m_IsDrag = false;

    [HideInInspector]
	public GameObject m_MessageRecieaver_OK = null;
    [HideInInspector]
	public string m_Message_OK = null;
    [HideInInspector]
	public object m_Message_OK_Parameter = null;

    [HideInInspector]
	public GameObject m_MessageRecieaver_NO = null;
    [HideInInspector]
	public string m_Message_NO = null;
    [HideInInspector]
	public object m_Message_NO_Parameter = null;

    public bool m_IsNeedStandardBG = false;
    public bool m_IsNeedBGBlur = true;

    public string m_PopupSound = "UI_popup_open";
	public string m_PopupEndSound = "UI_popup_close";

    void Awake()
    {       
        AwakeInit();
    }

    public virtual void AwakeInit()
    {
    }

    // Use this for initialization
    void Start()
    {
        if (m_PopupSound.Trim().Length > 0)
			SoundController.PlaySound(m_PopupSound);

        isAbleControl = true;   // 씬 로딩후 터치 가능
        StartInit();
    }

    public virtual void StartInit()
    {
    }

    // Update is called once per frame
    void Update()
    {
        if (PopupManager.Instance.m_PopupStack.Peek() == this)
        {
            if (Input.GetKeyDown(KeyCode.Escape))
            {
                // 안드로이드 백버튼 처리 구역
                BackButton();
            }

            if (isAbleControl)  // 터치 받을지 말지
                UpdateTouch();
            UpdateScene();
        }
    }

    public virtual void UpdateScene()
    {
    }

    public virtual void UpdateTouch()       // 터치 입력 받는 함수. ButtonTouch 외에 다른 작업할경우 오버라이드해서 구현 사용
    {     
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray;
            RaycastHit rayHit;

            ray = PopupManager.Instance.m_PopupUICamera.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out rayHit, 1000.0f))
            {
                m_PretouchOBJ = rayHit.collider.gameObject;
            }

            m_SaveTouchDown.Set(Input.mousePosition.x, Input.mousePosition.y);
        }

        if (Input.GetMouseButton(0))
        {
            if (m_IsDrag == false)
            {
                if (System.Math.Abs(Input.mousePosition.x - m_SaveTouchDown.x) > m_DragGap
                    || System.Math.Abs(Input.mousePosition.y - m_SaveTouchDown.y) > m_DragGap)
                {
                    m_IsDrag = true;
                }
                else
                {
                    m_IsDrag = false;
                }
            }
        }

        if (Input.GetMouseButtonUp(0))
        {
            Ray ray;
            RaycastHit rayHit;

            ray = PopupManager.Instance.m_PopupUICamera.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out rayHit, 1000.0f))
            {
                if (m_PretouchOBJ != rayHit.collider.gameObject)
                    return;
            }

            if (!m_IsDrag && rayHit.collider != null)
            {
                ButtonTouch(rayHit.collider);
            }

            m_IsDrag = false;
            m_PretouchOBJ = null;
        }
    }

    public virtual void ButtonTouch(Collider collider)  // 버튼 터치 (터치 시작 끝 같은 오브젝트일때 터치 끝 시점에 호출)
    {
        //switch (collider.gameObject.name)
        //{
        //    case "Button_Scout":
        //        break;
        //}
    }

    public void SetEventOK(GameObject recieaver, string message)
    {
        m_MessageRecieaver_OK = recieaver;
        m_Message_OK = message;
    }

	public void SetEventOK(GameObject recieaver, string message, object parameter)
	{
		m_MessageRecieaver_OK = recieaver;
		m_Message_OK = message;
		m_Message_OK_Parameter = parameter;
	}

    public void SetEventNO(GameObject recieaver, string message)
    {
        m_MessageRecieaver_NO = recieaver;
        m_Message_NO = message;
    }

	public void SetEventNO(GameObject recieaver, string message, object parameter)
	{
		m_MessageRecieaver_NO = recieaver;
		m_Message_NO = message;
		m_Message_NO_Parameter = parameter;
	}

    public virtual void BackButton()
    {
        if (m_MessageRecieaver_NO != null && m_Message_NO != null)
            m_MessageRecieaver_NO.SendMessage(m_Message_NO);

        PopupManager.PopPopup();
    }

    void OnDestroy()
    {
		if (m_PopupEndSound.Trim().Length > 0)
        	SoundController.PlaySound(m_PopupEndSound);
    }
}
